package zeus.controller;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.ejb.EJB;
import javax.enterprise.context.SessionScoped;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;
import javax.inject.Inject;
import javax.inject.Named;

import zeus.exception.LoginException;
import zeus.model.Cliente;
import zeus.model.Estado;
import zeus.model.Reserva;
import zeus.service.EjbClienteService;
import zeus.service.EjbLoginService;

@Named("cadastrarUsuario")
@SessionScoped
public class CadastrarUsuario implements Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = -1306138278456738489L;

	private Cliente hospede = new Cliente();

	private String senha1 = "";
	private String senha2 = "";
	private String senhaAtual = "";

	@Inject
	ReservarAction reservarAction;

	@EJB
	EjbClienteService ejbCadastroService;

	@EJB
	EjbLoginService ejbLoginService;
	
	@Inject
	Mailer mailer;

	public String cadastrar() {
		if (!ejbCadastroService.senhasIguais(senha1, senha2)) {
			FacesMessage msgSenhas = new FacesMessage(
					FacesMessage.SEVERITY_WARN, "Senhas não Conferem",
					"As Senhas digitadas não são iguais");
			FacesContext.getCurrentInstance().addMessage(null, msgSenhas);
			return "";
		} else {
			hospede.setSenha(senha1);
		}
		if (ejbCadastroService.calcularIdade(hospede.getDataNascimento()) < 18) {
			FacesMessage msgNascimento = new FacesMessage(
					FacesMessage.SEVERITY_WARN, "Menor de 18 Anos",
					"Não é possível realizar o cadastro de menores de 18 anos");
			FacesContext.getCurrentInstance().addMessage(null, msgNascimento);
			return "";
		} else if (ejbCadastroService.hasCadastro(hospede.getEmail())) {
			FacesMessage msgJaPossuiCadastro = new FacesMessage(
					FacesMessage.SEVERITY_WARN, "Cadastro Existente",
					"O e-mail informado já consta no sistema");
			FacesContext.getCurrentInstance().addMessage(null,
					msgJaPossuiCadastro);
			return "";
		} else {
			hospede.setPrimeiroAcesso(false);
			ejbCadastroService.cadastrarCliente(hospede);
			try {
				hospede = ejbLoginService.loginCliente(hospede.getEmail(),
						hospede.getSenha());
			} catch (Exception e) {
				FacesMessage msgLogin = new FacesMessage(
						FacesMessage.SEVERITY_WARN, "Error Login",
						"Aconteceu um erro inesperado");
				FacesContext.getCurrentInstance().addMessage(null, msgLogin);
			}
			FacesMessage cadastro = new FacesMessage(
					FacesMessage.SEVERITY_INFO, "Cadastro Realizado",
					"Cadastro Realizado com Sucesso");
			FacesContext.getCurrentInstance().addMessage(null, cadastro);
			return "/usuario.xhtml";
		}
	}

	public String cadastrarEreservar() {
		if (ejbCadastroService.hasCadastro(hospede.getEmail())) {
			FacesMessage msgJaPossuiCadastro = new FacesMessage(
					FacesMessage.SEVERITY_WARN, "Cadastro Existente",
					"O e-mail informado já consta no sistema");
			FacesContext.getCurrentInstance().addMessage(null,
					msgJaPossuiCadastro);
			return "";
		} else {
			hospede.setSenha(ejbCadastroService.gerarSenhaAleatoria());
			System.out.println(hospede.getSenha());
			hospede.setPrimeiroAcesso(true);
			ejbCadastroService.cadastrarCliente(hospede);
			mailer.sendMail(hospede);
			
			FacesMessage msg = new FacesMessage(
					FacesMessage.SEVERITY_INFO, "Cadastro de Hospede Realizado",
					"Um email foi enviado informando a senha do primeiro acesso");
			FacesContext.getCurrentInstance().addMessage(null,
					msg);
			
			return reservarAction.consolidarReserva(hospede.getEmail());
		}

	}

	public String login(String email, String senha) {
		try {
			hospede = ejbLoginService.loginCliente(email, senha);
			return "usuario.xhtml";
		} catch (LoginException e) {
			FacesMessage msgLogin = new FacesMessage(
					FacesMessage.SEVERITY_WARN, "Cadastro não encontrado",
					"Os dados informados não constam no sistema");
			FacesContext.getCurrentInstance().addMessage(null, msgLogin);
			return "";
		}
	}
	
	public String cadastrarNovaSenha(){
		if(!ejbCadastroService.senhasIguais(senha1, senha2)){
			FacesMessage msgSenhas = new FacesMessage(
					FacesMessage.SEVERITY_WARN, "Senhas não Conferem",
					"As Senhas digitadas não são iguais");
			FacesContext.getCurrentInstance().addMessage(null, msgSenhas);
			return "";
		}else{
			hospede.setSenha(senha1);
			hospede.setPrimeiroAcesso(false);
			ejbCadastroService.atualizarCliente(hospede);
			
			FacesMessage msg = new FacesMessage(
					FacesMessage.SEVERITY_INFO, "Senha Atualizada",
					"Senha atualizada com sucesso");
			FacesContext.getCurrentInstance().addMessage(null,
					msg);
			
			
			return "usuario.xhtml";
		}
	}
	
	public String alterarSenha(){
		if(hospede.getSenha().compareTo(senhaAtual) == 0)
			return cadastrarNovaSenha();
		else{
			FacesMessage msgSenhas = new FacesMessage(
					FacesMessage.SEVERITY_WARN, "Senha incorreta",
					"A senha digitada não é a senha atual.");
			FacesContext.getCurrentInstance().addMessage(null, msgSenhas);
			
			return "";
		}
	}

	public String logout() {
		hospede = new Cliente();
		return "/home.xhtml";
	}

	public Cliente getHospede() {
		return hospede;
	}

	public void setHospede(Cliente hospede) {
		this.hospede = hospede;
	}

	public boolean isClienteLogado() {
		return hospede.getId() != null;
	}

	public List<SelectItem> getEstados() {
		List<SelectItem> listaEstados = new ArrayList<SelectItem>();

		for (Estado e : Estado.values()) {
			listaEstados.add(new SelectItem(e, e.getNome()));
		}

		return listaEstados;
	}

	public String getSenha1() {
		return senha1;
	}

	public void setSenha1(String senha1) {
		this.senha1 = senha1;
	}

	public String getSenha2() {
		return senha2;
	}

	public void setSenha2(String senha2) {
		this.senha2 = senha2;
	}
	
	public String getSenhaAtual() {
		return senhaAtual;
	}

	public void setSenhaAtual(String senhaAtual) {
		this.senhaAtual = senhaAtual;
	}

	public boolean isEstadoSaoPaulo() {
		if (hospede.getEndereco().getEstado() != null) {
			if (hospede.getEndereco().getEstado().getNome()
					.equalsIgnoreCase("São Paulo"))
				;
			return true;
		}
		return false;

	}
	
	public List<Reserva> getListaReservas(){
		return ejbCadastroService.listaReservas(hospede.getId());
	}

	/*
	 * Validar CPF
	 */

}
